/*
 * Equipo.java
 *
 * Created on 3 de abril de 2007, 16:13
 *
 */

package futbol.tacticas.concursantes2007.tikitaka.tactica;

import futbol.General;
import java.awt.Point;
/**
 *
 * @author Ismael Mariscal Mena
 */
public class Equipo {
    
    Point posicionActual[];   //Posicion actual de los jugadores
    Point posicionAnterior[]; //Posicion anterior de los jugadores
    int velocidad[];          //Velocidad de cada jugador
    int velocidad_2[];        //Velocidad al cuadrado del jugador
    int fuerza[];             //Fuerza de cada jugador
    boolean calcularVelocidad;//Indica si tenemos que calcular la velocidad de los jugadores
    int v[][];                //Velocidad que hemos ido calculando del jugador
    boolean vCalculada[];     //Indica si hemos calculado la velocidad del jugador i
        
    /** Creates a new instance of Equipo */
    public Equipo() {
        velocidad = new int[11];
        velocidad_2 = new int[11];
        fuerza = new int[11];
        posicionActual = new Point[11];
        posicionAnterior = new Point[11];
        for (int i = 1; i < 11; i++)
        {
            posicionActual[i] = new Point(0, 0);
            posicionAnterior[i] = new Point(0, 0);
        }
        calcularVelocidad = false;
    }
    
    public Equipo(boolean calcularVelocidad)
    {
        velocidad = new int[11];
        velocidad_2 = new int[11];
        fuerza = new int[11];
        posicionActual = new Point[11];
        posicionAnterior = new Point[11];
        for (int i = 0; i < 11; i++)
        {
            posicionActual[i] = new Point(0, 0);
            posicionAnterior[i] = new Point(0, 0);
        }
        this.calcularVelocidad = calcularVelocidad;
        if (calcularVelocidad == true)
        {
            v = new int[11][4];
            vCalculada = new boolean[11];
            for (int i = 0; i < 11; i++)
            {
                for (int j = 0; j < 3; j++)
                    v[i][j] = 0;
                vCalculada[i] = false;
            }
        }
    }
    
    public void setPosicionActual(Point posicion[])
    {
        posicionAnterior = posicionActual;
        posicionActual = posicion;
        if (calcularVelocidad == true)
        {
            calcularVelocidad = false;
            for (int i = 0; i < 11; i++)
            {
                if (vCalculada[i] == false)
                {
                    calcularVelocidad = true;
                    int vel = (int)Math.round(Util.distancia(posicionAnterior[i], posicionActual[i]));
                    if (vel >= 3 && vel <= 6)
                        v[i][vel - 3]++; 
                    int vmax = 3;
                    int cont = 0;
                    for (int j = 0; j < 4; j++)
                    {
                        if (v[i][j] >= v[i][vmax - 3])
                            vmax = j + 3;
                        cont += v[i][j]; 
                    }
                    //Leemos 25 veces la velocidad de un jugador, siempre que sta sea vlida (v >= 3 && v <= 6), por ejemplo si un jugador
                    //est parado, calcularemos una velocidad de 0, pero esta no es vlida, y su velocidad ser la que mayor nmero de veces
                    //hayamos calculado.
                    if (cont >= 25)
                    {
                        setVelocidad(i, vmax);   //Ajustamos la velocidad
                        vCalculada[i] = true;   //Indicamos q ya hemos calculado la velocidad del jugador i
                    }  
                } 
            }
        }
    }
    
    public void setVelocidad(int velocidad[])
    {
        this.velocidad = velocidad;
        for (int i = 0; i < 11; i++)
            velocidad_2[i] = velocidad[i] * velocidad[i];
    }
    
    public void setVelocidad(int jugador, int velocidad)
    {
        if (jugador >= 0 && jugador <= 10)
        {
            this.velocidad[jugador] = velocidad;
            velocidad_2[jugador] = velocidad * velocidad;
            this.fuerza[jugador] = 10 - velocidad;
        }
    }
    
    public void setFuerza(int fuerza[])
    {
        this.fuerza = fuerza;
    }
    
    public void setFuerza(int jugador, int fuerza)
    {
        if (jugador >= 0 && jugador <= 10)
        {
            this.fuerza[jugador] = fuerza;
            this.velocidad[jugador] = 10 - fuerza;
            velocidad_2[jugador] = velocidad[jugador] * velocidad[jugador];
        }
    }
    
    public Point getPosicion(int jugador)
    {
        return posicionActual[jugador];
    }
    
    public int getVelocidad(int jugador)
    {
        return velocidad[jugador];
    }
    
    public int getVelocidad_2(int jugador)
    {
        return velocidad_2[jugador];
    }
    
    public int calculaVelocidad(int jugador)
    {
        return (int)Math.round(Util.distancia(posicionAnterior[jugador], posicionActual[jugador]));
    }
    
    public int getFuerza(int jugador)
    {
        return fuerza[jugador];
    }
    
    public int jugadorMasCercanoBola(Balon balon, MDouble tiempo)
    {
//        Point posicionFutura;
        int velocidadBola = (int)balon.getVelocidad();  
        double tiempoBola;
        int jug, velocidadFinal;

        if (velocidadBola >= 15)
            velocidadFinal = 15;
        else
            velocidadFinal = velocidadBola + 1;

        do
        {
            velocidadFinal--;
            tiempoBola = velocidadBola - velocidadFinal;
            jug = jugadorMasCercano(balon.getPosicion((int)tiempoBola), tiempo);
        } while (tiempo.v > tiempoBola);

        return jug;
    }

    public int jugadorMasCercano(Point posicion, MDouble tiempo)
    {
        int jugador = 0;  //-1
        double distancia, tiempoTemporal;
        tiempo.v = Double.POSITIVE_INFINITY;
        for (int i = 0; i < 11; i++)
        {
           distancia = General.getDistancia(posicionActual[i].x, posicionActual[i].y, posicion.x, posicion.y) - 9;
           tiempoTemporal = distancia / velocidad[i];
//           tiempoTemporal = (Util.distancia(posicionActual[i], posicion) - 9) / velocidad[i];
//           System.out.println("--- " + "j: " + i + posicionActual[i] + "-" + posicion + " d:" + distancia + " v:" + velocidad + " t:" + tiempoTemporal);
           if (tiempoTemporal < tiempo.v)
           {
               tiempo.v = tiempoTemporal;
               jugador = i;
           }
        }
        return jugador;
    }
}
